from flask import Blueprint, request, jsonify, current_app
from flasgger import swag_from
from app.models.banner import Banner
from app.utils.response import success_response, error_response
from app.utils.decorators import login_required
from datetime import datetime

banner_bp = Blueprint('user_banners', __name__)

@banner_bp.route('/', methods=['GET'])
@login_required
@swag_from({
    'tags': ['用户-Banner'],
    'summary': '获取Banner列表',
    'description': '用户查看轮播图列表，只显示当前有效期内的启用Banner，按排序顺序和创建时间排序。',
    'security': [{'Bearer': []}],
    'parameters': [
        {
            'name': 'Authorization',
            'in': 'header',
            'required': True,
            'type': 'string',
            'description': 'JWT token，格式：Bearer {token}，从登录接口获取'
        },
        {
            'name': 'limit',
            'in': 'query',
            'type': 'integer',
            'default': 10,
            'description': '获取数量限制'
        }
    ],
    'responses': {
        200: {
            'description': '获取成功',
            'schema': {
                'type': 'object',
                'properties': {
                    'code': {'type': 'integer', 'example': 200},
                    'message': {'type': 'string', 'example': '获取成功'},
                    'data': {
                        'type': 'array',
                        'items': {
                            'type': 'object',
                            'properties': {
                                'id': {'type': 'integer'},
                                'title': {'type': 'string'},
                                'description': {'type': 'string'},
                                'image_url': {'type': 'string'},
                                'link_url': {'type': 'string'},
                                'link_type': {'type': 'string', 'enum': ['external', 'internal', 'venue', 'miniprogram', 'none']},
                                'link_target': {'type': 'string'},
                                'link_appid': {'type': 'string'},
                                'sort_order': {'type': 'integer'}
                            }
                        }
                    }
                }
            }
        }
    }
})
def get_banners():
    """获取Banner列表"""
    try:
        limit = request.args.get('limit', 10, type=int)
        limit = min(limit, 50)  # 最多50个
        
        now = datetime.now()
        
        # 查询有效的Banner
        banners = Banner.query.filter(
            Banner.status == 1,  # 启用状态
            (Banner.start_time.is_(None) | (Banner.start_time <= now)),  # 开始时间为空或已到
            (Banner.end_time.is_(None) | (Banner.end_time >= now))  # 结束时间为空或未到
        ).order_by(Banner.sort_order.asc(), Banner.created_at.desc()).limit(limit).all()
        
        banner_list = []
        for banner in banners:
            banner_data = {
                'id': banner.id,
                'title': banner.title,
                'description': banner.description,
                'image_url': banner.image_url,
                'link_url': banner.link_url,
                'link_type': banner.link_type,
                'link_target': banner.link_target,
                'link_appid': banner.link_appid,
                'sort_order': banner.sort_order
            }
            banner_list.append(banner_data)
        
        return success_response(banner_list, '获取成功')
        
    except Exception as e:
        current_app.logger.error(f"获取Banner列表失败: {str(e)}")
        return error_response('获取失败', 500)

@banner_bp.route('/<int:banner_id>', methods=['GET'])
@login_required
@swag_from({
    'tags': ['用户-Banner'],
    'summary': '获取Banner详情',
    'description': '用户查看Banner详细信息，包含标题、描述、图片链接、跳转链接等完整信息。',
    'security': [{'Bearer': []}],
    'parameters': [
        {
            'name': 'Authorization',
            'in': 'header',
            'required': True,
            'type': 'string',
            'description': 'JWT token，格式：Bearer {token}，从登录接口获取'
        },
        {
            'name': 'banner_id',
            'in': 'path',
            'type': 'integer',
            'required': True,
            'description': 'Banner ID'
        }
    ],
    'responses': {
        200: {
            'description': '获取成功',
            'schema': {
                'type': 'object',
                'properties': {
                    'code': {'type': 'integer', 'example': 200},
                    'message': {'type': 'string', 'example': '获取成功'},
                    'data': {
                        'type': 'object',
                        'properties': {
                            'id': {'type': 'integer'},
                            'title': {'type': 'string'},
                            'description': {'type': 'string'},
                            'image_url': {'type': 'string'},
                            'link_url': {'type': 'string'},
                            'link_type': {'type': 'string', 'enum': ['external', 'internal', 'venue', 'miniprogram', 'none']},
                            'link_target': {'type': 'string'},
                            'link_appid': {'type': 'string'},
                            'sort_order': {'type': 'integer'},
                            'start_time': {'type': 'string'},
                            'end_time': {'type': 'string'}
                        }
                    }
                }
            }
        },
        404: {
            'description': 'Banner不存在'
        }
    }
})
def get_banner_detail(banner_id):
    """获取Banner详情"""
    try:
        banner = Banner.query.get(banner_id)
        if not banner or banner.status != 1:
            return error_response('Banner不存在', 404)
        
        # 检查Banner是否在有效期内
        now = datetime.now()
        if banner.start_time and banner.start_time > now:
            return error_response('Banner尚未开始', 404)
        if banner.end_time and banner.end_time < now:
            return error_response('Banner已过期', 404)
        
        banner_data = {
            'id': banner.id,
            'title': banner.title,
            'description': banner.description,
            'image_url': banner.image_url,
            'link_url': banner.link_url,
            'link_type': banner.link_type,
            'link_target': banner.link_target,
            'link_appid': banner.link_appid,
            'sort_order': banner.sort_order,
            'start_time': banner.start_time.strftime('%Y-%m-%d %H:%M:%S') if banner.start_time else None,
            'end_time': banner.end_time.strftime('%Y-%m-%d %H:%M:%S') if banner.end_time else None
        }
        
        return success_response(banner_data, '获取成功')
        
    except Exception as e:
        current_app.logger.error(f"获取Banner详情失败: {str(e)}")
        return error_response('获取失败', 500) 